<?php

namespace App\Utils;

	/**
	* 文件管理基类
	*
	* @throws		FileNotExistException			文件不存在
	* @throws		DirNotExistException			目录不存在
	* @throws		FailToDeleteFileException		删除文件失败
	* @throws		FailToDeleteDirException		删除目录失败
	*/
	abstract class FileManager
	{
		protected $fileName;

		function __construct()
		{

		}

		/**
		 * 获取图片地址
		 * @param  $fileKey		图片对应的 key
		 * @param  $type    
		 * @return $fileUrl 	图片的 url 地址
		 */
		abstract public function getFileUrl($fileKey = null, $type = null);

		/**
		 * @param 	$filePath 	要删除的图片路径
		 */
		static public function deleteFile($filePath)
		{
			if(!file_exists($filePath))
				throw new FileNotExistException();

			if(!@unlink($filePath))
				throw new FailToDeleteFileException();

			return true;
		}

		/**
		 * 清空一个目录中的所有文件
		 */
		static public function clearDir($dirPath)
		{	
			// 判断目录是否有效
			if(!file_exists($dirPath))
				throw new DirNotExistException();

			//用opendir打开目录
			$dir = opendir($dirPath);		

			//使用readdir循环读取目录里的内容
			while($filename = readdir($dir)) {    
				//排除"."和".."这两个特殊的目录  
				if($filename != "." && $filename != "..") {	
					$filePath = $dirPath . "/" . $filename;  

					//判断是否是目录，如果是则调用自身 
					if(is_dir($filePath)) { 		
						//使用递归删除子目录   	 
                		self::deleteDir($filePath); 	
                	} else {
                		self::deleteFile($filePath);
                	}
				}
			}  

			//关闭文件操作句柄   
			closedir($dir);								
		} 

		/**
		 * 删除一个目录，包括该目录中所有的文件
		 */
		static public function deleteDir($dirPath)
		{
			// 先清空该目录下的所有文件和文件夹 
			self::clearDir($dirPath);

			// 再删除该空目录
			if(!rmdir($dirPath))
				throw new FailToDeleteDirException();
		}
	}